/*****************************************************************//**
 * \file   CDBReader.h
 * \brief  CDBReader
 *
 * \author Wyatt
 * \date   May 2023
 *********************************************************************/
#pragma once

#include <map>
#include <unordered_map>
#include <string>
#include <iostream>
#include <fstream>

#include "Define.h"
#include "AnsysDef.h"
#include "AnsysDataDef.h"
#include "TxtMemStream.h"
#include "SimdroidMeshDef.h"

using std::string;
class ReaderBase;

/*!
 * @brief Ansys MAPDL CDB reader.
 */
class CDBReader
{
public:
	CDBReader(void);
	virtual ~CDBReader(void);

	static CDBReader* Inst();
	void init(string filePath);
	bool Read();

	bool Scan();
	void Scan_Variable(string& strLine);
	bool FindVariable(const std::string& str, std::string& strVal);

	bool Build();
	bool destroy_build();
	string filePath() { return _filePath; }
	int GetLineNumber() { return _nLine; }
	bool allocMem();
	TxtMemStream* fs() { return _file; }

	ReaderBase* GetReader(ANSYS_KEYWORD keyw);


	//! true为"3d"，false为"2d"
	static bool AnalysisDimention3D;

	void cleanUp();
protected:
	ANSYS_KEYWORD GetKey(std::string& keystr);

private:
	

	static CDBReader* _instance;
	string            _filePath;
	TxtMemStream*     _file { nullptr};

	SKey              _nLine = 0;

public:
	int AddET(AnsysET* pA);
	int AddNode(int id, AnsysNode* pA);
	//void AddElem(AnsysPropTup& prop, AnsysElem& elem);
	void AddElement(AnsysElement& elem);
	void AddElementToset(AnsysElement& elem);
	//int AddMaterial(int mid, std::vector<MaterialBase*>*& pMat);
	//int AddSection(int mid, AnsysSection* sec) { _secMap[mid] = sec; return (int)_secMap.size(); }
	int AddSection(int mid, AnsysSection* sec); 
	void AddTargetSet(AnsysTargetInfor* pTarget) { _vecTargetSetItems.push_back(pTarget); }
	void AddOutputSet(AnsysSetInfor* pTarget) { _vecSetItems.push_back(pTarget); }
	void AddConnect(AnsysConnectTarget* pTarget) { _vecConnectItems.push_back(pTarget); }
	void AddDim(AnsysDim& dim) { _dimMap[dim.strName] = dim; }
	void AddRealSet(AnsysRealSet* realset) { _vecRealSet.push_back(realset); }
	void AddStep(AnsysStep& step) { _curStep++; _vecStep.push_back(step); }
	//将读取的EN的数据添加cdbreader中
	void AddEN(AnsysElement& elem);

	std::unordered_map<int, AnsysNode*>& GetNodes() { return _nodeMap; }
	bool ifHaveNode(int& id) const
	{
		if (_nodeMap.find(id) != _nodeMap.end())
		{
			return true;
		}		
		else
		{
			return false;
		}
	};

	bool ifHaveOutoutSet(std::string& str) const
	{
		for (auto& iter : _vecSetItems)
		{
			if (iter->setName == str)
			{
				return true;
			}
		}
		return false;
	};

	//! 返回找到的输出的set的包含的id
	//! type :0为Node,1为Elem
	std::vector<int> getOutputSetIds(std::string& str, int& type) const
	{
		for (auto& iter : _vecSetItems)
		{
			if (iter->setName == str&&iter->setType == (ANSYS_TARGET_TYPE)(type + 1))
			{
				return iter->outIds;
			}
		}
		return std::vector<int>{};
	};

	//AnsysProp& GetProps() { return _propMap; }
	AnsysPropNew& GetProps() { return _propMap; }
	std::vector<int>& GetNodeVecHlp() { return _nodeHlp; }
	//std::vector<HlpElemProp>& GetElemVecHlp() { return _elemHlp; }
	//std::unordered_map<int, AnsysPropTup>& GetElemMapHlp() { return _elemHlpMap; }
	//std::unordered_map<int, int>& GetElemIdxMapHlp() { return _elemIdxHlpMap; }
	std::vector<AnsysElement>& GetElemVec() { return _elementOut; }
	std::unordered_map<int, int>& GetElemIdxMap() { return _elemAnsysIdToOutid; }

	std::vector<AnsysTargetInfor*>& GetTargetSet() { return _vecTargetSetItems; }
	std::vector<AnsysSetInfor*>& GetOutputSet() { return _vecSetItems; }
	std::vector<AnsysConnectTarget*>& GetConnectVec() { return _vecConnectItems; }
	//std::map<int, std::vector<MaterialBase*>>& GetMats() { return _matMap; }

	std::vector<AnsysET*>  GetEtVec() { return _etVec; };
	AnsysET* FindETById(int id);
	//std::vector<MaterialBase*>* FindMatByID(int mid);
	bool FindDim(std::string& str, AnsysDim& findDim);
	//获取所有的截面属性信息
	std::map<int, AnsysSection*>& GetSections() { return _secMap; }

private:
	std::unordered_map<string, string>    _variables;
	std::unordered_map<std::string, AnsysDim>       _dimMap;
	std::vector<AnsysRealSet*>            _vecRealSet;

	std::vector<AnsysET*>                 _etVec;
	std::unordered_map<int, int>          _etMap;          //! id => index in _etVec
	std::unordered_map<int, AnsysNode*>   _nodeMap;

	AnsysPropNew                          _propMap;
	//AnsysProp                             _propMap;

	std::vector<int>                      _nodeHlp;         // _nodeHlp[node index] = node id
	//std::vector<HlpElemProp>              _elemHlp;         // _elemHlp[elem index] = element property tuple key
	//std::unordered_map<int, AnsysPropTup> _elemHlpMap;      // <old elem id, property key> by order; use this to get element property key from element index
	//std::unordered_map<int, int>          _elemIdxHlpMap;   // <elem id, elem index>; couple to '_elemHlp' index; use this to get element id from element index
	std::vector<AnsysElement>             _elementOut;
	std::unordered_map<int, int>          _elemAnsysIdToOutid;  //! ansys id => out id;   out id = (index in _elementOut) + 1

	//std::map<int, std::vector<MaterialBase*>> _matMap;
	std::map<int, AnsysSection*>              _secMap;
	std::vector<AnsysTargetInfor*>            _vecTargetSetItems;
	std::vector<AnsysSetInfor*>               _vecSetItems;
	std::vector<AnsysConnectTarget*>          _vecConnectItems;	

	std::vector<AnsysStep>                 _vecStep;
	std::vector<AnsysLbcItem*>             _vecDItems;

public: // temporary data
	AnsysMPTEMP      _curMPTEMP;
	AnsysTB          _curTB;

	int              _curStep;

	double           _curInitialTemperature;

	std::map<std::string, AnsysCmBlock>    _cmMap;

	//! current set name=>ids,clear before add data
	std::unordered_map<std::string, std::vector<int>> _currentSet;

	//! 定义局部变量
	std::unordered_map<std::string, std::string> _localValue;

	bool ifEleToSet = false;
	//std::vector<AnsElemType::Type> _ansysEleTypeToIBESet;
	//std::vector<std::pair<int, std::vector<AnsysElem>>> _ansysEleToIBESet;
	//std::unordered_map<int, AnsysElem> _elemNotModalMap;
    
	//! 暂时不用
	// AnsysPropNew                          _elemToSetProp;
	std::vector<AnsysElement>             _elementToSet;
	std::unordered_map<int, int>          _elemAnsysIdToSetid;  //! outId = index+1; index:postion in _elementOut

public:
	bool ifBuildMap;
	//! node => element
	std::unordered_map<int, std::set<int>> _nodeToElement;
	void buildNodeToElement();

public:
	//std::unordered_map<int, Ansys_Contact174> allContactEt;
	std::unordered_map<int, Ansys_Target170> allTargetEt;
	//contact174和contact175都属于contact类型
	std::unordered_map<int, std::shared_ptr<Ansys_Contact>> allContactEt;

public:
	std::map<std::string, std::string> _mulSet;

private:
	//! @breaf: 检测单元中是否存在不存在的node，有不合理node则抛出异常
	//! @para
	//! @element: 检查的单元
	void checkElementNode(const AnsysElement& element);
public:
	int write_vtk_file(std::string exe_path, std::string read_file_path, std::string write_file_path);
	int write_gmsh_file_from_vtk(std::string exe_path, std::string read_file_path, std::string write_file_path);
};

using namespace SimElem;
typedef struct tagAnsysElementShapeInfo
{
	Type type;
	unsigned long opt;
} AnsysElementShapeInfo;

static AnsysElementShapeInfo _gAnsysToIBEElem[] =
{
	{ E_UNKNOWN, Opt_None },		// 0 (UNKNOWN)
	{ E_102, Opt_None },			// 1 (LINK1)
	{ E_206, Opt_None },			// 2 (PLANE2)
	{ E_102, Opt_None },			// 3 (BEAM3)
	{ E_102, Opt_None },			// 4 (BEAM4)
	{ E_308, I },					// 5 (SOLID5)
	{ E_UNKNOWN, Opt_None },		// 6 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 7 (UNKNOWN)
	{ E_102, Opt_None },			// 8 (LINK8)
	{ E_102, Opt_None },			// 9 (INFIN9)
	{ E_UNKNOWN, Opt_None },		// 10 (UNKNOWN)
	{ E_102, Opt_None },			// 11 (LINK11)
	{ E_UNKNOWN, Opt_None },		// 12 (UNKNOWN)
	{ E_204, Opt_None },			// 13 (PLANE13)
	{ E_102, Opt_None },			// 14 (COMBIN14)
	{ E_UNKNOWN, Opt_None },		// 15 (UNKNOWN)
	{ E_102, Opt_None },			// 16 (PIPE16)
	{ E_102, Opt_None },			// 17 (PIPE17)
	{ E_102, Opt_None },			// 18 (PIPE18)
	{ E_UNKNOWN, Opt_None },		// 19 (UNKNOWN)
	{ E_102, Opt_None },			// 20 (PIPE20)
	{ E_001, Opt_None },			// 21 (MASS21)
	{ E_UNKNOWN, Opt_None },		// 22 (UNKNOWN)
	{ E_102, Opt_None },			// 23 (BEAM23)
	{ E_102, Opt_None },			// 24 (BEAM24)
	{ E_204, Opt_None },			// 25 (PLANE25)
	{ E_UNKNOWN, Opt_None },		// 26 (UNKNOWN)
	{ E_102, Opt_None },			// 27 (MATRIX27)
	{ E_204, Opt_None },			// 28 (SHELL28)
	{ E_204, Opt_None },			// 29 (FLUID29)
	{ E_308, I },					// 30 (FLUID30)
	{ E_102, Opt_None },			// 31 (LINK31)
	{ E_102, Opt_None },			// 32 (LINK32)
	{ E_102, Opt_None },			// 33 (LINK33)
	{ E_102, Opt_None },			// 34 (LINK34)
	{ E_206, Opt_None },			// 35 (PLANE35)
	{ E_102, Opt_None },			// 36 (SOURC36)
	{ E_UNKNOWN, Opt_None },		// 37 (COMBIN37)
	{ E_UNKNOWN, Opt_None },		// 38 (FLUID38)
	{ E_102, Opt_None },			// 39 (COMBIN39)
	{ E_102, Opt_None },			// 40 (COMBIN40)
	{ E_204, Opt_None },			// 41 (SHELL41)
	{ E_204, Opt_None },			// 42 (UNKNOWN)
	{ E_204, Opt_None },			// 43 (SHELL43)
	{ E_102, Opt_None },			// 44 (BEAM44)
	{ E_308, I },					// 45 (SOLID45)
	{ E_308, Opt_None },			// 46 (SOLID46)
	{ E_204, Opt_None },			// 47 (INFIN47)
	{ E_UNKNOWN, Opt_None },		// 48 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 49 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 50 (MATRIX50)
	{ E_102, Opt_None },			// 51 (SHELL51)
	{ E_UNKNOWN, Opt_None },		// 52 (UNKNOWN)
	{ E_208, Opt_None },			// 53 (PLANE53)
	{ E_102, Opt_None },			// 54 (BEAM54)
	{ E_204, Opt_None },			// 55 (PLANE55)
	{ E_UNKNOWN, Opt_None },		// 56 (UNKNOWN)
	{ E_204, Opt_None },			// 57 (SHELL57)
	{ E_UNKNOWN, Opt_None },		// 58 (UNKNOWN)
	{ E_102, Opt_None },			// 59 (PIPE59)
	{ E_102, Opt_None },			// 60 (PIPE60)
	{ E_102, Opt_None },			// 61 (SHELL61)
	{ E_308, I },					// 62 (SOLID62)
	{ E_204, Opt_None },			// 63 (SHELL63)
	{ E_308, Opt_None },			// 64 (SOLID64)
	{ E_308, I },					// 65 (SOLID65)
	{ E_UNKNOWN, Opt_None },		// 66 (UNKNOWN)
	{ E_204, Opt_None },			// 67 (PLANE67)
	{ E_102, Opt_None },			// 68 (LINK68)
	{ E_308, Opt_None },			// 69 (SOLID69)
	{ E_308, I },					// 70 (SOLID70)
	{ E_001, Opt_None },			// 71 (MASS71)
	{ E_308, Opt_None },			// 72 (SOLID72)
	{ E_UNKNOWN, Opt_None },		// 73 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 74 (UNKNOWN)
	{ E_204, Opt_None },			// 75 (PLANE75)
	{ E_UNKNOWN, Opt_None },		// 76 (UNKNOWN)
	{ E_208, Opt_None },			// 77 (PLANE77)
	{ E_208, Opt_None },			// 78 (PLANE78)
	{ E_204, Opt_None },			// 79 (FLUID79)
	{ E_308, I },					// 80 (FLUID80)
	{ E_204, Opt_None },			// 81 (FLUID81)
	{ E_208, Opt_None },			// 82 (PLANE82)
	{ E_208, Opt_None },			// 83 (PLANE83)
	{ E_UNKNOWN, Opt_None },		// 84 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 85 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 86 (UNKNOWN)
	{ E_310, Opt_None },			// 87 (SOLID87)
	{ E_UNKNOWN, Opt_None },		// 88 (UNKNOWN)
	{ E_320, Opt_None },			// 89 (VISCO89)
	{ E_320, Opt_None },			// 90 (SOLID90)
	{ E_208, Opt_None },			// 91 (SHELL91)
	{ E_310, Opt_None },			// 92 (SOLID92)
	{ E_204, Opt_None },			// 93 (SHELL93)
	{ E_102, Opt_None },			// 94 (CIRCU94)
	{ E_320, Opt_None },			// 95 (SOLID95)
	{ E_308, I },					// 96 (SOLID96)
	{ E_308, I },					// 97 (SOLID97)
	{ E_310, Opt_None },			// 98 (SOLID98)
	{ E_204, Opt_None },			// 99 (SHELL99)
	{ E_UNKNOWN, Opt_None },		// 100 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 101 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 102 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 103 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 104 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 105 (UNKNOWN)
	{ E_204, Opt_None },			// 106 (VISCO106)
	{ E_308, Opt_None },			// 107 (VISCO107)
	{ E_208, Opt_None },			// 108 (VISCO108)
	{ E_310, Opt_None },			// 109 (HF109)
	{ E_UNKNOWN, Opt_None },		// 110 (INFIN110)
	{ E_308, I },					// 111 (INFIN111)
	{ E_UNKNOWN, Opt_None },		// 112 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 113 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 114 (UNKNOWN)
	{ E_204, Opt_None },			// 115 (INTER115)
	{ E_UNKNOWN, Opt_None },		// 116 (FLUID116)
	{ E_320, Opt_None },			// 117 (SOLID117)
	{ E_308, I },					// 118 (HF118)
	{ E_310, Opt_None },			// 119 (HF119)
	{ E_320, Opt_None },			// 120 (HF120)
	{ E_208, I },					// 121 (PLANE121)
	{ E_320, Opt_None },			// 122 (SOLID122)
	{ E_310, Opt_None },			// 123 (SOLID123)
	{ E_102, Opt_None },			// 124 (CIRCU124)
	{ E_102, Opt_None },			// 125 (CIRCU125)
	{ E_102, Opt_None },			// 126 (TRANS126)
	{ E_310, Opt_None },			// 127 (SOLID127)
	{ E_320, Opt_None },			// 128 (SOLID128)
	{ E_102, Opt_None },			// 129 (FLUID129)
	{ E_204, Opt_None },			// 130 (FLUID130)
	{ E_204, Opt_None },			// 131 (SHELL131)
	{ E_208, Opt_None },			// 132 (SHELL132)
	{ E_UNKNOWN, Opt_None },		// 133 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 134 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 135 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 136 (FLUID136)
	{ E_UNKNOWN, Opt_None },		// 137 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 138 (FLUID138)
	{ E_UNKNOWN, Opt_None },		// 139 (FLUID139)
	{ E_UNKNOWN, Opt_None },		// 140 (UNKNOWN)
	{ E_204, Opt_None },			// 141 (FLUID141)
	{ E_308, I },					// 142 (FLUID142)
	{ E_204, Opt_None },			// 143 (SHELL143)
	{ E_UNKNOWN, Opt_None },		// 144 (ROM144)
	{ E_208, Opt_None },			// 145 (UNKNOWN)
	{ E_206, Opt_None },			// 146 (PLANE146)
	{ E_320, Opt_None },			// 147 (SOLID147)
	{ E_310, Opt_None },			// 148 (SOLID148)
	{ E_UNKNOWN, Opt_None },		// 149 (UNKNOWN)
	{ E_208, Opt_None },			// 150 (SHELL150)
	{ E_103, Opt_None },			// 151 (SURF151)
	{ E_204, Opt_None },			// 152 (SURF152)
	{ E_102, Opt_None },			// 153 (SURF153)
	{ E_208, Opt_None },			// 154 (SURF154)
	{ E_UNKNOWN, Opt_None },		// 155 (UNKNOWN)
	{ E_103, Opt_None },			// 156 (SURF156)
	{ E_204, Opt_None },			// 157 (SHELL157)
	{ E_UNKNOWN, Opt_None },		// 158 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 159 (SURF159)
	{ E_102, Opt_None },			// 160 (LINK160)
	{ E_102, Opt_None },			// 161 (BEAM161)
	{ E_204, Opt_None },			// 162 (PLANE162)
	{ E_204, Opt_None },			// 163 (SHELL163)
	{ E_308, I },					// 164 (SOLID164)
	{ E_102, Opt_None },			// 165 (COMBIN165)
	{ E_001, Opt_None },			// 166 (MASS166)
	{ E_102, Opt_None },			// 167 (LINK167)
	{ E_310, Opt_None },			// 168 (SOLID168)
	{ E_001, Opt_None },			// 169 (TARGET169)
	{ E_001, Opt_None },			// 170 (TARGET170)
	{ E_102, Opt_None },			// 171 (CONTA171)
	{ E_103, Opt_None },			// 172 (CONTA172)
	{ E_204, Opt_None },			// 173 (CONTA173)
	{ E_208, Opt_None },			// 174 (CONTA174)
	{ E_001, Opt_None },			// 175 (CONTA175)
	{ E_102, Opt_None },			// 176 (CONTA176)
	{ E_102, Opt_None },			// 177 (CONTA177)
	{ E_102, Opt_None },			// 178 (CONTA178)
	{ E_UNKNOWN, Opt_None },		// 179 (PRETS179)
	{ E_102, Opt_None },			// 180 (LINK180)
	{ E_204, Opt_None },			// 181 (SHELL181)
	{ E_204, Opt_None },			// 182 (PLANE182)
	{ E_208, Opt_None },			// 183 (PLANE183)
	{ E_UNKNOWN, Opt_None },		// 184 (MPC184)
	{ E_308, I },					// 185 (SOLID185)
	{ E_320, Opt_None },			// 186 (SOLID186)
	{ E_310, Opt_None },			// 187 (SOLID187)
	{ E_102, Opt_None },			// 188 (BEAM188)
	{ E_102, Opt_None },			// 189 (BEAM189)
	{ E_308, I },					// 190 (SOLSH190)
	{ E_320, Opt_None },			// 191 (SOLID191)
	{ E_204, Opt_None },			// 192 (INTER192)
	{ E_204, Opt_None },			// 193 (INTER193)
	{ E_320, Opt_None },			// 194 (INTER194)
	{ E_308, Opt_None },			// 195 (INTER195)
	{ E_UNKNOWN, Opt_None },		// 196 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 197 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 198 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 199 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 200 (MESH200)
	{ E_001, Opt_None },			// 201 (FOLLW201)
	{ E_204, Opt_None },			// 202 (INTER202)
	{ E_UNKNOWN, Opt_None },		// 203 (INTER203)
	{ E_320, Opt_None },			// 204 (INTER204)
	{ E_308, Opt_None },			// 205 (INTER205)
	{ E_UNKNOWN, Opt_None },		// 206 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 207 (UNKNOWN)
	{ E_102, Opt_None },			// 208 (SHELL208)
	{ E_103, Opt_None },			// 209 (SHELL209)
	{ E_UNKNOWN, Opt_None },		// 210 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 211 (UNKNOWN)
	{ E_204, Opt_None },			// 212 (CPT212)
	{ E_208, Opt_None },			// 213 (CPT213)
	{ E_UNKNOWN, Opt_None },		// 214 (COMBI214)
	{ E_308, I },					// 215 (CPT215)
	{ E_320, Opt_None },			// 216 (CPT216)
	{ E_310, Opt_None },			// 217 (CPT217)
	{ E_UNKNOWN, Opt_None },		// 218 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 219 (UNKNOWN)
	{ E_320, Opt_None },			// 220 (FLUID220)
	{ E_310, Opt_None },			// 221 (FLUID221)
	{ E_204, Opt_None },			// 222 (PLANE222)
	{ E_208, Opt_None },			// 223 (PLANE223)
	{ E_UNKNOWN, Opt_None },		// 224 (UNKNOWN)
	{ E_308, I },					// 225 (SOLID225)
	{ E_320, Opt_None },			// 226 (SOLID226)
	{ E_310, Opt_None },			// 227 (SOLID227)
	{ E_UNKNOWN, Opt_None },		// 228 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 229 (UNKNOWN)
	{ E_208, Opt_None },			// 230 (PLANE230)
	{ E_320, Opt_None },			// 231 (SOLID231)
	{ E_310, Opt_None },			// 232 (SOLID232)
	{ E_208, Opt_None },			// 233 (PLANE233)
	{ E_UNKNOWN, Opt_None },		// 234 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 235 (UNKNOWN)
	{ E_320, Opt_None },			// 236 (SOLID236)
	{ E_310, Opt_None },			// 237 (SOLID237)
	{ E_208, Opt_None },			// 238 (SOLID238)
	{ E_320, Opt_None },			// 239 (SOLID239)
	{ E_310, Opt_None },			// 240 (SOLID240)
	{ E_203, Opt_None },			// 241 (HSFLD241)
	{ E_208, Opt_None },			// 242 (HSFLD242)
	{ E_UNKNOWN, Opt_None },		// 243 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 244 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 245 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 246 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 247 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 248 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 249 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 250 (UNKNOWN)
	{ E_102, Opt_None },			// 251 (SURF251)
	{ E_204, Opt_None },			// 252 (SURF252)
	{ E_UNKNOWN, Opt_None },		// 253 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 254 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 255 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 256 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 257 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 258 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 259 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 260 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 261 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 262 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 263 (REINF263)
	{ E_UNKNOWN, Opt_None },		// 264 (REINF264)
	{ E_UNKNOWN, Opt_None },		// 265 (REINF265)
	{ E_UNKNOWN, Opt_None },		// 266 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 267 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 268 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 269 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 270 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 271 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 272 (SOLID272)
	{ E_UNKNOWN, Opt_None },		// 273 (SOLID273)
	{ E_UNKNOWN, Opt_None },		// 274 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 275 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 276 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 277 (UNKNOWN)
	{ E_308, I },					// 278 (SOLID278)
	{ E_320, Opt_None },			// 279 (SOLID279)
	{ E_103, Opt_None },			// 280 (CABLE280)
	{ E_208, Opt_None },			// 281 (SHELL281)
	{ E_UNKNOWN, Opt_None },		// 282 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 283 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 284 (UNKNOWN)
	{ E_304, Opt_None },			// 285 (SOLID285)
	{ E_UNKNOWN, Opt_None },		// 286 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 287 (UNKNOWN)
	{ E_102, Opt_None },			// 288 (PIPE288)
	{ E_103, Opt_None },			// 289 (PIPE289)
	{ E_103, Opt_None },			// 290 (ELBOW290)
	{ E_310, Opt_None },			// 291 (SOLID291)
	{ E_204, Opt_None },			// 292 (PLANE292)
	{ E_308, I },					// 293 (PLANE293)
	{ E_UNKNOWN, Opt_None },		// 294 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 295 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 296 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 297 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 298 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 299 (UNKNOWN)
	{ E_UNKNOWN, Opt_None },		// 300 (USER300)

	// To be added...
};

typedef struct tagAnsysElementTypeInfo {
	int iNodeCnt; 			    // Node Count (Max)
	int iNodeCornerCnt; 	    // Apex Node Count ( Topological, Simple ) : without Middle Node, Center Node
	int AnsToSimdoridOrder[30];	// convert element connectivity from Ansys to Simdroid
} AnsysElementTypeInfo;
static AnsysElementTypeInfo _gAnsysETI[] =
{
	{ 0, 0,{ 0 } },															// 0 (UNKNOWN)
	{ 2, 2,{ 0,1 } },														// 1 (LINK1)
	{ 6, 3,{ 0,1,2,3,4,5 } },												// 2 (PLANE2)
	{ 2, 2,{ 0,1 } },														// 3 (BEAM3)
	{ 2, 2,{ 0,1 } },														// 4 (BEAM4)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 5 (SOLID5)
	{ 0, 0,{ 0 } },															// 6 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 7 (UNKNOWN)
	{ 2, 2,{ 0,1 } },														// 8 (LINK8)
	{ 2, 2,{ 0,1 } },														// 9 (INFIN9)
	{ 2, 2,{ 0,1 } },														// 10 (LINK10)
	{ 2, 2,{ 0,1 } },														// 11 (LINK11)
	{ 0, 0,{ 0 } },															// 12 (UNKNOWN)
	{ 4, 4,{ 0,1,2,3 } },													// 13 (PLANE13)
	{ 2, 2,{ 0,1 } },														// 14 (COMBIN14)
	{ 0, 0,{ 0 } },															// 15 (UNKNOWN)
	{ 2, 2,{ 0,1 } },														// 16 (PIPE16)
	{ 2, 2,{ 0,1 } },														// 17 (PIPE17)
	{ 2, 2,{ 0,1 } },														// 18 (PIPE18)
	{ 0, 0,{ 0 } },															// 19 (UNKNOWN)
	{ 2, 2,{ 0,1 } },														// 20 (PIPE20)
	{ 1, 1,{ 0 } },															// 21 (MASS21)
	{ 0, 0,{ 0 } },															// 22 (UNKNOWN)
	{ 2, 2,{ 0,1 } },														// 23 (BEAM23)
	{ 2, 2,{ 0,1 } },														// 24 (BEAM24)
	{ 4, 4,{ 0,1,2,3 } },													// 25 (PLANE25)
	{ 0, 0,{ 0 } },															// 26 (UNKNOWN)
	{ 2, 2,{ 0,1 } },														// 27 (MATRIX27)
	{ 4, 4,{ 0,1,2,3 } },													// 28 (SHELL28)
	{ 4, 4,{ 0,1,2,3 } },													// 29 (FLUID29)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 30 (FLUID30)
	{ 2, 2,{ 0,1 } },														// 31 (LINK31)
	{ 2, 2,{ 0,1 } },														// 32 (LINK32)
	{ 2, 2,{ 0,1 } },														// 33 (LINK33)
	{ 2, 2,{ 0,1 } },														// 34 (LINK34)
	{ 6, 3,{ 0,1,2,3,4,5 } },												// 35 (PLANE35)
	{ 2, 2,{ 0,1 } },														// 36 (SOURC36)
	{ 0, 0,{ 0 } },															// 37 (COMBIN37)
	{ 0, 0,{ 0 } },															// 38 (FLUID38)
	{ 2, 2,{ 0,1 } },														// 39 (COMBIN39)
	{ 2, 2,{ 0,1 } },														// 40 (COMBIN40)
	{ 4, 4,{ 0,1,2,3 } },													// 41 (SHELL41)
	{ 4, 4,{ 0,1,2,3 } },													// 42 (SHELL42)
	{ 4, 4,{ 0,1,2,3 } },													// 43 (SHELL43)
	{ 2, 2,{ 0,1 } },														// 44 (BEAM44)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 45 (SOLID45)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 46 (SOLID46)
	{ 4, 4,{ 0,1,2,3 } },													// 47 (INFIN47)
	{ 0, 0,{ 0 } },															// 48 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 49 (UNKNOWN)
	{ 2, 2,{ 0,1 } },														// 50 (MATRIX50)
	{ 0, 0,{ 0 } },															// 51 (SHELL51)
	{ 0, 0,{ 0 } },															// 52 (UNKNOWN)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 53 (PLANE53)
	{ 2, 2,{ 0,1 } },														// 54 (BEAM54)
	{ 4, 4,{ 0,1,2,3 } },													// 55 (PLANE55)
	{ 0, 0,{ 0 } },															// 56 (UNKNOWN)
	{ 4, 4,{ 0,1,2,3 } },													// 57 (SHELL57)
	{ 0, 0,{ 0 } },															// 58 (UNKNOWN)
	{ 2, 2,{ 0,1 } },														// 59 (PIPE59)
	{ 2, 2,{ 0,1 } },														// 60 (PIPE60)
	{ 2, 2,{ 0,1 } },														// 61 (SHELL61)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 62 (SOLID62)
	{ 4, 4,{ 0,1,2,3 } },													// 63 (SHELL63)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 64 (SOLID64)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 65 (SOLID65)
	{ 0, 0,{ 0 } },															// 66 (UNKNOWN)
	{ 4, 4,{ 0,1,2,3 } },													// 67 (PLANE67)
	{ 2, 2,{ 0,1 } },														// 68 (LINK68)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 69 (SOLID69)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 70 (SOLID70)
	{ 1, 1,{ 0 } },															// 71 (MASS71)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 72 (SOLID72)
	{ 0, 0,{ 0 } },															// 73 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 74 (UNKNOWN)
	{ 4, 4,{ 0,1,2,3 } },													// 75 (PLANE75)
	{ 0, 0,{ 0 } },															// 76 (UNKNOWN)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 77 (PLANE77)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 78 (PLANE78)
	{ 4, 4,{ 0,1,2,3 } },													// 79 (FLUID79)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 80 (FLUID80)
	{ 4, 4,{ 0,1,2,3 } },													// 81 (FLUID81)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 82 (PLANE82)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 83 (PLANE83)
	{ 0, 0,{ 0 } },															// 84 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 85 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 86 (UNKNOWN)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 87 (SOLID87)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 88 (VISCO88)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 89 (VISCO89)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 90 (SOLID90)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 91 (SHELL91)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 92 (SOLID92)
	{ 4, 4,{ 0,1,2,3 } },													// 93 (SHELL93)
	{ 2, 2,{ 0,1 } },														// 94 (CIRCU94)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 95 (SOLID95)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 96 (SOLID96)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 97 (SOLID97)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 98 (SOLID98)
	{ 4, 4,{ 0,1,2,3 } },													// 99 (SHELL99)
	{ 0, 0,{ 0 } },															// 100 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 101 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 102 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 103 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 104 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 105 (UNKNOWN)
	{ 4, 4,{ 0,1,2,3 } },													// 106 (VISCO106)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 107 (VISCO107)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 108 (VISCO108)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 109 (HF109)
	{ 0, 0,{ 0 } },															// 110 (INFIN110)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 111 (INFIN111)
	{ 0, 0,{ 0 } },															// 112 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 113 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 114 (UNKNOWN)
	{ 4, 4,{ 0,1,2,3 } },													// 115 (INTER115)
	{ 0, 0,{ 0 } },															// 116 (FLUID116)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 117 (SOLID117)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 118 (HF118)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 119 (HF119)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 120 (HF120)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 121 (PLANE121)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 122 (SOLID122)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 123 (SOLID123)
	{ 2, 2,{ 0,1 } },														// 124 (CIRCU124)
	{ 2, 2,{ 0,1 } },														// 125 (CIRCU125)
	{ 2, 2,{ 0,1 } },														// 126 (TRANS126)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 127 (SOLID127)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 128 (SOLID128)
	{ 2, 2,{ 0,1 } },														// 129 (FLUID129)
	{ 4, 4,{ 0,1,2,3 } },													// 130 (FLUID130)
	{ 4, 4,{ 0,1,2,3 } },													// 131 (SHELL131)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 132 (SHELL132)
	{ 0, 0,{ 0 } },															// 133 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 134 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 135 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 136 (FLUID136)
	{ 0, 0,{ 0 } },															// 137 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 138 (FLUID138)
	{ 0, 0,{ 0 } },															// 139 (FLUID139)
	{ 0, 0,{ 0 } },															// 140 (UNKNOWN)
	{ 4, 4,{ 0,1,2,3 } },													// 141 (FLUID141)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 142 (FLUID142)
	{ 4, 4,{ 0,1,2,3 } },													// 143 (SHELL143)
	{ 0, 0,{ 0 } },															// 144 (ROM144)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 145 (PLANE145)
	{ 6, 3,{ 0,1,2,3,4,5 } },												// 146 (PLANE146)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 147 (SOLID147)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 148 (SOLID148)
	{ 0, 0,{ 0 } },															// 149 (UNKNOWN)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 150 (SHELL150)
	{ 3, 2,{ 0,1,2 } },														// 151 (SURF151)
	{ 4, 4,{ 0,1,2,3 } },													// 152 (SURF152)
	{ 2, 2,{ 0,1 } },														// 153 (SURF153)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 154 (SURF154)
	{ 0, 0,{ 0 } },															// 155 (UNKNOWN)
	{ 3, 2,{ 0,1,2 } },														// 156 (SURF156)
	{ 4, 4,{ 0,1,2,3 } },													// 157 (SHELL157)
	{ 0, 0,{ 0 } },															// 158 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 159 (SURF159)
	{ 2, 2,{ 0,1 } },														// 160 (LINK160)
	{ 2, 2,{ 0,1 } },														// 161 (BEAM161)
	{ 4, 4,{ 0,1,2,3 } },													// 162 (PLANE162)
	{ 4, 4,{ 0,1,2,3 } },													// 163 (SHELL163)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 164 (SOLID164)
	{ 2, 2,{ 0,1 } },														// 165 (COMBIN165)
	{ 1, 1,{ 0 } },															// 166 (MASS166)
	{ 2, 2,{ 0,1 } },														// 167 (LINK167)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 168 (SOLID168)
	{ 2, 2,{ 0,1 } },														// 169 (TARGET169)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 170 (TARGET170)
	{ 2, 2,{ 0,1 } },														// 171 (CONTA171)
	{ 3, 3,{ 0,1,2 } },														// 172 (CONTA172)
	{ 4, 4,{ 0,1,2,3 } },													// 173 (CONTA173)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 174 (CONTA174)
	{ 1, 1,{ 0 } },															// 175 (CONTA175)
	{ 2, 2,{ 0,1 } },														// 176 (CONTA176)
	{ 2, 2,{ 0,1 } },														// 177 (CONTA177)
	{ 2, 2,{ 0,1 } },														// 178 (CONTA178)
	{ 0, 0,{ 0 } },															// 179 (PRETS179)
	{ 2, 2,{ 0,1 } },														// 180 (LINK180)
	{ 4, 4,{ 0,1,2,3 } },													// 181 (SHELL181)
	{ 4, 4,{ 0,1,2,3 } },													// 182 (PLANE182)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 183 (PLANE183)
	{ 0, 0,{ 0 } },															// 184 (MPC184)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 185 (SOLID185)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 186 (SOLID186)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 187 (SOLID187)
	{ 2, 2,{ 0,1 } },														// 188 (BEAM188)
	{ 2, 2,{ 0,1 } },														// 189 (BEAM189)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 190 (SOLSH190)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 191 (SOLID191)
	{ 4, 4,{ 0,1,2,3 } },													// 192 (INTER192)
	{ 4, 4,{ 0,1,2,3 } },													// 193 (INTER193)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 194 (INTER194)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 195 (INTER195)
	{ 0, 0,{ 0 } },															// 196 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 197 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 198 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 199 (UNKNOWN)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },        // 200 (MESH200)
	{ 1, 1,{ 0 } },															// 201 (FOLLW201)
	{ 4, 4,{ 0,1,2,3 } },													// 202 (INTER202)
	{ 0, 0,{ 0 } },															// 203 (INTER203)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 204 (INTER204)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 205 (INTER205)
	{ 0, 0,{ 0 } },															// 206 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 207 (UNKNOWN)
	{ 2, 2,{ 0,1 } },														// 208 (SHELL208)
	{ 3, 2,{ 0,1,2 } },														// 209 (SHELL209)
	{ 0, 0,{ 0 } },															// 210 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 211 (UNKNOWN)
	{ 4, 4,{ 0,1,2,3 } },													// 212 (CPT212)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 213 (CPT213)
	{ 0, 0,{ 0 } },															// 214 (COMBI214)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 215 (CPT215)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 216 (CPT216)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 217 (CPT217)
	{ 0, 0,{ 0 } },															// 218 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 219 (UNKNOWN)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 220 (FLUID220)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 221 (FLUID221)
	{ 4, 4,{ 0,1,2,3 } },													// 222 (PLANE222)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 223 (PLANE223)
	{ 0, 0,{ 0 } },															// 224 (UNKNOWN)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 225 (SOLID225)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 226 (SOLID226)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 227 (SOLID227)
	{ 0, 0,{ 0 } },															// 228 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 229 (UNKNOWN)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 230 (PLANE230)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 231 (SOLID231)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 232 (SOLID232)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 233 (PLANE233)
	{ 0, 0,{ 0 } },															// 234 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 235 (UNKNOWN)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 236 (SOLID236)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 237 (SOLID237)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 238 (SOLID238)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 239 (SOLID239)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 240 (SOLID240)
	{ 3, 3,{ 0,1,2 } },														// 241 (HSFLD241)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 242 (HSFLD242)
	{ 0, 0,{ 0 } },															// 243 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 244 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 245 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 246 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 247 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 248 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 249 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 250 (UNKNOWN)
	{ 2, 2,{ 0,1 } },														// 251 (SURF251)
	{ 4, 4,{ 0,1,2,3 } },													// 252 (SURF252)
	{ 0, 0,{ 0 } },															// 253 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 254 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 255 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 256 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 257 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 258 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 259 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 260 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 261 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 262 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 263 (REINF263)
	{ 0, 0,{ 0 } },															// 264 (REINF264)
	{ 0, 0,{ 0 } },															// 265 (REINF265)
	{ 0, 0,{ 0 } },															// 266 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 267 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 268 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 269 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 270 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 271 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 272 (SOLID272)
	{ 0, 0,{ 0 } },															// 273 (SOLID273)
	{ 0, 0,{ 0 } },															// 274 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 275 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 276 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 277 (UNKNOWN)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 278 (SOLID278)
	{ 20, 8,{ 0,1,2,3,4,5,6,7,8,9,10,11,16,17,18,19,12,13,14,15 } },		// 279 (SOLID279)
	{ 3, 2,{ 0,1,2 } },														// 280 (CABLE280)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 281 (SHELL281)
	{ 0, 0,{ 0 } },															// 282 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 283 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 284 (UNKNOWN)
	{ 4, 4,{ 0,1,2,3 } },													// 285 (SOLID285)
	{ 0, 0,{ 0 } },															// 286 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 287 (UNKNOWN)
	{ 2, 2,{ 0,1 } },														// 288 (PIPE288)
	{ 3, 2,{ 0,1,2 } },														// 289 (PIPE289)
	{ 3, 2,{ 0,1,2 } },														// 290 (ELBOW290)
	{ 10, 4,{ 0,1,2,3,4,5,6,7,8,9 } },										// 291 (SOLID291)
	{ 4, 4,{ 0,1,2,3, } },													// 292 (PLANE292)
	{ 8, 4,{ 0,1,2,3,4,5,6,7 } },											// 293 (PLANE293)
	{ 0, 0,{ 0 } },															// 294 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 295 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 296 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 297 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 298 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 299 (UNKNOWN)
	{ 0, 0,{ 0 } },															// 300 (USER300)

	{ 0, 0,{ 0 } }															// 301 (END)
};

inline bool BadId(int ndIdx, int* nids);

inline bool BadId(SKey ndIdx, SKey* nids);
typedef struct tagAnsysElementDegen2Info {
	int etype;              // Simdroid element type
	int AnsDegenOrder[30];	// degenerate element connectivity compare to non-degenerated
} AnsysElementDegen2Info;
typedef struct tagAnsysElementDegenerateInfo {
	AnsysElementDegen2Info to0;
	AnsysElementDegen2Info to1;
	AnsysElementDegen2Info to2;
	AnsysElementDegen2Info to3;
	AnsysElementDegen2Info to4;
	AnsysElementDegen2Info to5;
	AnsysElementDegen2Info to6;
	AnsysElementDegen2Info to7;
	AnsysElementDegen2Info to8;
	AnsysElementDegen2Info to9;
} AnsysElementDegenerateInfo;

//! Ansys CDB degenerated element node order map
static AnsysElementDegenerateInfo _gAnsysCdbDegenOrder[] =
{
	//UNKNOWN,
	{ 0 },
	//E_001,
	{
		{
			E_001,
			{ 0 }
		}
	},
	//E_102,
	{
		{
			E_102,
			{ 0,1 }
		}
	},
	//E_103,
	{
		{
			E_103,
			{ 0,1,2 }
		},
		{
			E_102,
			{ 0,1 }
		},
	},
	//E_203,
	{
		{
			E_203,
			{ 0,1,2 }
		}
	},
	//E_204,
	{
		{
			E_204,
			{ 0,1,2,3 }
		},
		{
			E_203,
			{ 0,1,2 }
		},
	},
	//E_206,
	{
		{
			E_206,
			{ 0,1,2,3,4,5 }
		},
		{
			E_204,
			{ 0,1,2,3 }
		},
	},
	//E_208,
	{
		{
			E_208,
			{ 0,1,2,3,4,5,6,7 }
		},
		{
			E_206,
			{ 0,1,2,4,5,6 }
		},
		{
			E_204,
			{ 0,1,2,3 }
		},
		{
			E_203,
			{ 0,1,2 }
		},
	},
	//E_209,
	{
		{
			E_209,
			{ 0,1,2,3,4,5,6,7,8 }
		}
	},
	//E_304,
{
	{
		E_304,
		{ 0,1,2,3 }
	}
},
//E_305,
{
	{
		E_305,
		{ 0,1,2,3,4 }
	},
	{
		E_304,
		{ 0,1,2,3 }
	},
},
//E_306,
{
	{
		E_306,
		{ 0,1,2,3,4,5 }
	}
},
//E_308,
{
	{
		E_308,
		{ 0,1,2,3,4,5,6,7 }
	},
	{
		E_306,
		{ 0,1,2,4,5,6 }
	},
	{
		E_305,
		{ 0,1,2,3,4 }
	},
	{
		E_304,
		{ 0,1,2,4 }
	},
},
//E_310,
{
	{
		E_310,
		{ 0,1,2,3,4,5,6,7,8,9 }
	},
	{
		E_304,
		{ 0,1,2,3 }
	},
},
//E_312,
{
	{
		E_312,
		{ 0,1,2,3,4,5,6,7,8,9,10,11 }
	}
},
//E_313,
{
	{
		E_313,
		{ 0,1,2,3,4,5,6,7,8,9,10,11,12 }
	}
},
//E_315,
{
	{
		E_315,
		{ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 }
	}
},
//E_318,
{
	{
		E_318,
		{ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 }
	}
},
//E_320,
{
	{
		E_320,
		{ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 }
	},
	{
		E_315,
		{ 0,1,2,4,5,6,8,9,11,12,13,15,16,17,18 }
	},
	{
		E_313,
		{ 0,1,2,3,4,8,9,10,11,16,17,18,19 }
	},
	{
		E_310,
		{ 0,1,2,4,8,9,11,16,17,18 }
	},
	{
		E_308,
		{ 0,1,2,3,4,5,6,7 }
	},
	{
		E_306,
		{ 0,1,2,4,5,6 }
	},
	{
		E_305,
		{ 0,1,2,3,4 }
	},
	{
		E_304,
		{ 0,1,2,4 }
	},
},
//E_324,
{
	{
		E_324,
		{ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 }
	}
},
//E_327,
{
	{
		E_327,
		{ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 }
	}
}
};

static int* degenOrder(int usAnsType, int etype);

SimElem::Type GetSimElemShape(AnsElemType::Type ansEType, int& nnode, std::vector<int>& nids, int ntype);